#pragma once
#include <any>
#include <string>

// 事件类型枚举
enum class EventType {
    // 系统事件
    Timer,                  // 定时器事件
    
    // 行情相关事件
    TICK,                   // Tick数据事件
    BAR,                    // K线数据事件
    MARKET_CONNECTED,       // 市场连接事件
    MARKET_DISCONNECTED,    // 市场断开连接事件
    SUBSCRIBE,             // 订阅请求事件
    UNSUBSCRIBE,          // 取消订阅事件
    
    // 交易相关事件
    TRADER_CONNECTED,      // 交易连接事件
    TRADER_DISCONNECTED,   // 交易断开事件
    TRADER_LOGIN,         // 交易登录事件
    TRADER_LOGOUT,        // 交易登出事件
    ORDER_NEW,           // 新订单事件
    ORDER_FILLED,        // 订单成交事件
    ORDER_CANCELED,      // 订单取消事件
    ORDER_REJECTED,      // 订单拒绝事件
    TRADE_SIGNAL,        // 交易信号事件
    POSITION_CHANGED,    // 持仓变化事件
    ACCOUNT_CHANGED,     // 账户变化事件
    
    // 风控相关事件
    RISK_LIMIT_BREACH,   // 风控限制突破
    RISK_ALERT,         // 风控警告
    
    // 策略相关事件
    STRATEGY_INIT,      // 策略初始化
    STRATEGY_START,     // 策略启动
    STRATEGY_STOP,      // 策略停止
    STRATEGY_EXIT,      // 策略退出
    STRATEGY_SIGNAL,    // 策略信号
    
    // 日志相关事件
    LOG_INFO,          // 信息日志
    LOG_WARNING,       // 警告日志
    LOG_ERROR,         // 错误日志
    
    // 可以继续添加更多事件类型...
};

// 事件类
class Event {
public:
    // 默认构造函数
    Event() : m_type(EventType::Timer) {}
    
    // 带类型的构造函数
    explicit Event(EventType type) : m_type(type) {}
    
    // 带类型和数据的构造函数
    Event(EventType type, std::any data) 
        : m_type(type)
        , m_data(std::move(data)) {}
    
    // 获取事件类型
    EventType type() const { return m_type; }
    
    // 获取事件数据
    const std::any& data() const { return m_data; }
    std::any& data() { return m_data; }
    
    // 设置事件数据
    void setData(std::any data) { m_data = std::move(data); }
    
private:
    EventType m_type;
    std::any m_data;
}; 